package com.punch.course.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.punch.common.dto.course.ClassDTO;
import com.punch.common.dto.course.ClassSupplierDTO;
import com.punch.common.dto.course.ClassTeacherDTO;
import com.punch.common.page.PageInfo;
import com.punch.common.vo.common.OptionVO;
import com.punch.common.vo.course.*;
import com.punch.common.vo.course.classes.AppCourseClassPageVO;
import com.punch.common.vo.course.classes.ClassVO;
import com.punch.common.vo.course.report.CourseReportVO;
import com.punch.course.excel.StudentSignUpExcel;
import com.punch.course.model.PunchClass;
import com.punch.course.query.ClassQueryInfo;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.time.LocalDate;
import java.util.List;


/**
 * ClassService-班级信息 服务类
 *
 * @author xiaol
 * @version 1.0.0
 * @since 2020/7/22
 */
@Deprecated
public interface ClassService extends IService<PunchClass> {

    /**
     * 条件分页查询班级列表
     *
     * @return 班级信息
     */
    PageInfo<ClassPageVO> listClass(ClassQueryInfo classQueryInfo);

    /**
     * 简单班级列表
     *
     * @param schoolId
     * @return SimpleClassesVO
     */
    List<SimpleClassesVO> listSimpleClass(Long schoolId);

    /**
     * 保存班级信息
     *
     * @param classDTO 班级信息
     * @return 班级记录ID
     */
    Long saveClass(ClassDTO classDTO);

    /**
     * 修改班级信息
     *
     * @param classDTO 班级信息
     * @return 班级记录ID
     */
    Long updateClass(ClassDTO classDTO);

    /**
     * 查询班级详情
     *
     * @param classId 班级记录ID
     * @return 班级信息
     */
    ClassVO getClassById(Long classId);

    /**
     * 删除班级信息
     *
     * @param classId 班级ID
     */
    void deleteClassById(Long classId);

    /**
     * 班级启用/停用
     *
     * @param classId 班级id
     */
    void enableClass(Long classId);

    /**
     * 修改班级状态
     *
     * @param classId 班级id
     * @param status  状态
     */
    void updateClassStatus(Long classId, int status);


    /**
     * app学生可选课程列表
     *
     * @return PageInfo<AppCourseClassPageVO>
     * @author xiaol
     * @since 2020/7/23
     */
    PageInfo<AppCourseClassPageVO> listClassForApp(ClassQueryInfo classQueryInfo);


    /**
     * app端班级课程详情
     *
     * @param classId 班级id
     * @return AppClassVO
     */
    AppClassVO getClassForApp(Long classId, Long studentId);

    /**
     * 根据创建人id（学校id）查询对应的开课数量
     *
     * @param createId
     * @return
     */
    List<CourseReportVO> getCourseCount(Long createId);

    /**
     * 更改教师
     *
     * @param classTeacherDTO 更改教师表单
     * @return int
     */
    Long updateTeacher(ClassTeacherDTO classTeacherDTO);

    /**
     * 根据课程分类id查询课程详情列表
     *
     * @param categoryId
     * @return
     */
    List<ClassesVO> getClasses(Long categoryId);

    /**
     * 指定供应商
     *
     * @param classSupplierDTO 供应商表单
     * @return long
     */
    Long updateSupplier(ClassSupplierDTO classSupplierDTO);

    /**
     * 报名修改班级课程的报名人数
     *
     * @param courseClassId 班级课程id
     */
    Boolean updateSignUpNumber(Long courseClassId);

    /**
     * 取消订单修改班级课程的报名人数
     *
     * @param courseClassId 班级课程id
     */
    Boolean cancelSignUpNumber(Long courseClassId);

    /**
     * 获取课程班级教具结算信息
     *
     * @param courseClassId 班级课程id
     */
    MaterialSettlementVO getMaterialSettlement(Long courseClassId);

    /**
     * 查找未结算完成的课程,每月执行一次
     */
    List<CourseSettlementVO> listCourseSettlement();

    /**
     * 上课课表信息导出
     *
     * @param classId   课程id
     * @param type      类型 0-班级课表 1-学生签到课表
     * @param localDate type为有效 具体某期的课表
     * @param response  返回内容
     * @throws IOException
     */
    void exportSignUp(Long classId, Integer type, String localDate, HttpServletResponse response) throws IOException;

    /**
     * 进度进度+1
     *
     * @param classId 课程id
     */
    void updateClassFinishCount(Long classId);

    /**
     * 课程班级课节列表
     *
     * @param classId 班级课程id
     * @return Integer
     */
    List<OptionVO<LocalDate>> listCourseDate(Long classId);

    /**
     * 上课课表信息导出
     *
     * @param classId     课程id
     * @param classDate   上课日期
     * @param studentName 学生姓名
     * @param currPage    当前页
     * @param pageSize    每页大小
     */
    PageInfo<StudentSignUpExcel> listAttendance(Long classId, LocalDate classDate, String studentName, Integer currPage, Integer pageSize);

    /**
     * 批量导出学生课表
     *
     * @param classIds  学生ids
     * @param response 返回内容
     * @throws IOException
     */
    void batchExportSignUp(List<Long> classIds, HttpServletResponse response) throws IOException;
}
